/**
 * @Author: DengLibin
 * @Date: Create in 2024-10-16 15:03:01
 * @Description: 通信协议客户端
 */

package main

import (
	"crypto/tls"
	"encoding/binary"
	"fmt"
	"log"
	"net"
	"os"
)

// 发送消息：自定义格式为 1 字节消息类型 + 4 字节消息长度 + 消息内容
func sendMessage(conn net.Conn, msgType byte, data []byte) error {
	// 构建消息格式
	messageLength := uint32(len(data))
	buffer := make([]byte, 5+len(data))

	// 消息类型（1 字节）
	buffer[0] = msgType

	// 消息长度（4 字节），使用大端序编码
	binary.BigEndian.PutUint32(buffer[1:5], messageLength)

	// 消息内容
	copy(buffer[5:], data)

	// 发送消息
	_, err := conn.Write(buffer)
	return err
}

// 发送字符串
func sendString(conn net.Conn, message string) error {
	data := []byte(message)
	return sendMessage(conn, 1, data) // 1 表示字符串类型
}

// 发送文件
func sendFile(conn net.Conn, filePath string) error {
	file, err := os.Open(filePath)
	if err != nil {
		return err
	}
	defer file.Close()

	fileInfo, err := file.Stat()
	if err != nil {
		return err
	}

	// 读取文件内容
	buffer := make([]byte, fileInfo.Size())
	_, err = file.Read(buffer)
	if err != nil {
		return err
	}

	// 发送文件类型消息
	return sendMessage(conn, 2, buffer) // 2 表示文件类型
}

func main_client() {
	// 客户端 TLS 配置
	tlsConfig := &tls.Config{InsecureSkipVerify: true}
	conn, err := tls.Dial("tcp", "localhost:4433", tlsConfig)
	if err != nil {
		log.Fatalf("无法连接到服务器: %s", err)
	}
	defer conn.Close()

	// 发送字符串消息
	err = sendString(conn, "Hello, server!")
	if err != nil {
		log.Println("发送字符串失败: ", err)
	}

	// 发送文件
	err = sendFile(conn, "example.txt")
	if err != nil {
		log.Println("发送文件失败: ", err)
	}
	for {
		fmt.Print("input:")
		var msg string

		// 获取多个输入值
		fmt.Scan(&msg)
		if len(msg) > 0 {
			err = sendString(conn, msg)
			if err != nil {
				log.Println("发送字符串失败: ", err)
			}
		}
	}
}
